// 封装wx.request

import APIConfig from "../config/api"
import exceptionMessage from "../config/exception-message"
import wxToPromise from "./wx"
import cache from "../enum/cache";

class Http {
  // 静态方法，不需要实例化，调用可以直接用Http.request()
  static async request({ url, data, method='GET', header}) {
    const token = wx.getStorageSync(cache.TOKEN)
    let res
    try {
      res = await wxToPromise('request', {
        url: APIConfig.baseUrl +  url,
        data,
        method,
        header: {
          ...header,
          'Authorization': `Bearer ${token}`
        }
      })
    } catch (e) {
      throw new Error(e)
    }
        // 全局的统一响应、异常处理
        // 请求成功
        if(res.statusCode == 200) {
          // 请求失败
          if(res.data.code == 500) {
            wx.showToast({
              title: res.data.msg,
              icon: 'none',
              duration: 3000,
            })
            return
          }
          if(res.data.code == 401) {
            wx.showToast({
              title: '认证失败，无法访问系统资源,请重新登录',
              icon: 'none',
              duration: 3000,
            })
            wx.navigateTo({
              url: '/pages/login/index',
            })
            return
          }
          if(res.data.code == 601) {
            wx.showToast({
              title: res.data.msg,
              icon: 'none',
              duration: 3000,
            })
            return
          }
          return res.data
        }
        // 接口错误信息，一定要看清楚文档，哪些适合直接展示出去，哪些不合适
        Http._showError(res.data.error_code, res.data.message)
  }
  // 异常信息
  static _showError(errorCode, message) {
    let title = ''
    const errorMessage = exceptionMessage[errorCode];
    title = errorMessage || message || '未知异常'
    title = typeof title === 'object' 
      ? Object.values(title).join(';')
      : title
    wx.showToast({
      title,
      icon: 'none',
      duration: 3000,
    })
  }
}

export default Http